package com.sloera.spring.tx;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author sloera
 * @create 2020/4/12
 */
@Service("bookShopSservice")
public class BookShopSserviceImpl implements BookShopSservice {
    @Autowired
    private BookShopDao bookShopDao;

    /*
     * @Description 添加事务注解
     * 1.使用propagation指定事务的传播行为，即当前的事务方法被其他事务方法调用时，如何使用事务。默认取值为REQUIRED，使用调用方法的事务。
     * 2.使用isolation指定事务的隔离级别，最常用的取值为READ_UNCOMMITTED。默认情况，Spring的声明事事务对所有的运行时异常进行回滚，可以通过对应的属性进行设置。
     * 3.默认情况，Spring的声明事事务对所有的运行时异常进行回滚，可以通过对应的属性进行设置。
     * 4.使用readOnly指定事务是否只读。表示这个事务只读取但不更新事务，可以帮助数据库引擎优化事务
     * 5.使用timeout指定强制回滚之前事务可以占用的时间
     * @param username:购买用户
     * @param isbn:  购买书籍号
     * @Return void
     * @Author SloeraN
     * @Date 2020/4/12 19:22
     */
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_UNCOMMITTED, noRollbackFor = {UserAccountException.class}, readOnly = false, timeout = 2)
    @Override
    public void purchase(String username, String isbn) {
        //获取书的单价
        int bookPriceByIsbn = bookShopDao.findBookPriceByIsbn(isbn);
        //更新书的库存
        bookShopDao.updateBookStock(isbn);
        //更新用户余额
        bookShopDao.updateUserAccount(username, bookPriceByIsbn);
    }
}
